/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente.negocio;

import cliente.presentacion.administrador.citas.iJF_CitacionesAdmin;
import cliente.comunicacion.Proxy;
import cliente.presentacion.administrador.citas.JF_CitacionesAdmin;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.Beneficiario;
import server.dominio.Cita;
import server.dominio.Hora;
import server.dominio.Medico;
import server.excepciones.BeneficiarioInexistenteException;
import server.excepciones.CitaNoValidaException;
import server.excepciones.CitaYaExistenteException;
import server.excepciones.FechaNoValidaException;
import server.excepciones.MedicoInexistenteException;

/**
 *
 * @author tpaxle
 */
public class Controlador_Gestion_Cistas implements iControlador_Administrador{
    private Proxy proxy;
    private iControladorCitador C_Administrador;
    private iJF_CitacionesAdmin ventanacitas;

    private ArrayList<Object> listahorario;
    private ArrayList<ArrayList<Intervalo>> dias;
    private Vector<Cita> vectorcitas;

    private Beneficiario beneficiario=null;
    private Medico medico= null;

    private DateFormat formateadorfechahora;
    private DateFormat formateadorfecha;
    private Date fechaactiva;

    public Controlador_Gestion_Cistas(iControladorCitador C_Admin) {
        proxy= Proxy.getProxy();
        C_Administrador= C_Admin;
        ventanacitas= new JF_CitacionesAdmin(this);
        formateadorfechahora= new SimpleDateFormat("yyyy-MM-dd HH:00");
        formateadorfecha= new SimpleDateFormat("yyyy-MM-dd");
    }

    public void notificar(int noperacion, Object objeto) {
        //Si la notifiacion es del tipo 9 o 10 son alertas de citas
        Cita cita= null;
        switch(noperacion){
            //Se borra el beneficiario que se esta editando
            case 5:
                Beneficiario bene=(Beneficiario)objeto;
                if(cita.getBeneficiario().getIdBeneficiario_pk()== beneficiario.getIdBeneficiario_pk()){
                    ventanacitas.error(noperacion);
                }
            case 9:
                cita= (Cita)objeto;
                if(cita.getBeneficiario().getIdBeneficiario_pk()== beneficiario.getIdBeneficiario_pk()){
                    vectorcitas.add(cita);
                    //Reinicia la vista
                    mostrarcitasdia(fechaactiva);
                    ventanacitas.mostrar("El beneficiario ha pedido una nueva cita");
                }
                break;
            case 10:
                cita= (Cita)objeto;
                if(cita.getBeneficiario().getIdBeneficiario_pk()== beneficiario.getIdBeneficiario_pk()){
                    for(int i=0; i<vectorcitas.size();i++)
                        if(vectorcitas.get(i).getIdCita_pk()== cita.getIdCita_pk()){
                            //Reinicia la vista
                            vectorcitas.remove(vectorcitas.get(i));
                            mostrarhoradia(fechaactiva);
                            ventanacitas.mostrar("El beneficiario ha anulado una cita");
                        }
                }
                break;
        }




    }

    public void entregarUsuariosrecibidos(ArrayList<Object> usuarios, ArrayList<Object> beneficiarios) {
        //ignorar
    }

    public void entregarCentros(ArrayList<Object> centros) {
        //ignorar
    }

    public void entregarMedicos(ArrayList<Object> medicos) {
        //Tal vez no se ignoren
    }
    public void obtenerbeneficiariodni(String dni, String nss) {

        boolean existe= false;
        //Si el dni es mayor de 0 se comprueba dni
        if(dni.length()==0 && nss.length()==0){
            ventanacitas.error(4);
        }
        else{

            try {
                if(dni.length()>0){
                    
                    beneficiario= proxy.getBeneficiario(C_Administrador.getIdSesion(), dni);
                    C_Administrador.getAdmin_Control().log("Beneficiario obtenido "+ beneficiario);
                    existe= true;

                }
                if(!existe && nss.length()>0){
                    beneficiario = proxy.getBeneficiarionss(C_Administrador.getIdSesion(), dni);
                    C_Administrador.getAdmin_Control().log("Beneficiario obtenido " + beneficiario);
                    existe= true;
                }

                medico = proxy.getMedico(C_Administrador.getIdSesion(), beneficiario.getMedico().getNif());
               // C_Citador.mostrarcitausuario(beneficiario, medico);

                //Obtencion de horario del medico
               proxy.pedirhorario(C_Administrador.getIdSesion(), medico.getNif());
    //            this.C_Citador;
               vectorcitas=proxy.getCitas(C_Administrador.getIdSesion(), "05697853V");
            } catch (BeneficiarioInexistenteException ex) {
                //Carga el controlador para crear un beneficiairo  C_Citador.mostrarcrearbeneficiario(dni, nss);
                ventanacitas.error(1);
            } catch (MedicoInexistenteException ex) {
                ventanacitas.error(2);
            }
            catch (Exception ex){
                ventanacitas.error(3);
            }
        }

    }

    public void cerrar() {
        C_Administrador.cerrar();
    }

    public void entregarHorario(ArrayList<Object> lhora) {
        //Se puede iniciar
        listahorario=lhora;
        mostrardatosH();
    }

    private void mostrardatosH() {
        ventanacitas.mostrar(beneficiario, medico);
        mostrarhoradia(new Date());
    }

    private void mostrarhoradia(Date date) {
        DateFormat formateadorhora=  new SimpleDateFormat("HH");
        Hora hora_aux;
        int horatrabajo;
        String [] estados= new String[12];
        for(int i=0; i<12; i++)
             estados[i]= "No trabaja";
        for(int i=0; i< listahorario.size(); i++){
            hora_aux= (Hora)listahorario.get(i);
            if(formateadorfecha.format(hora_aux.getFecha_trabajo()).equals(formateadorfecha.format(date))){
                horatrabajo= Integer.parseInt(formateadorhora.format(hora_aux.getFecha_trabajo()));
                estados[horatrabajo-8]= hora_aux.getEstado();
            }
        }
        this.mostrarcitasdia(date);
        ventanacitas.mostrar(estados);

    }
    private void mostrarcitasdia(Date date){
        if(vectorcitas!=null){
            DateFormat formateadorhora=  new SimpleDateFormat("HH");
            Cita cita_aux= null;
            int horatrabajo;

            boolean [] estado_citas= new boolean[12];

            for(int i=0; i<12; i++)
                 estado_citas[i]= false;
            for(int i=0; i< vectorcitas.size(); i++){
                cita_aux= (Cita)vectorcitas.get(i);
                if(cita_aux.getFechaHora().substring(0, 10).equals(formateadorfecha.format(date))){
                    horatrabajo= Integer.parseInt(cita_aux.getFechaHora().substring(11, 13));
                    estado_citas[horatrabajo-8]= true;
                }
            }
            ventanacitas.mostrar(estado_citas);
        }
    }

    public void cambiodia(Date date) {
        fechaactiva= date;
        mostrarhoradia(date);
    }

    public void nuevacita(int horaseleccionada, Date fecha, String estado) {
        //Se comprueba si la hora seleccionada el medico esta libre
        //Buscamos la hora del trabajador
        try {
            if(estado.equals("Libre")){
                for(int i=0; i<listahorario.size(); i++){
                    Hora hora_citas= (Hora)listahorario.get(i);
                    DateFormat formatearHora= new SimpleDateFormat("HH");

                    if(formateadorfecha.format(fecha).equals(formateadorfecha.format(hora_citas.getFecha_trabajo())) && Integer.parseInt(formatearHora.format(hora_citas.getFecha_trabajo()))== horaseleccionada+8){
                        System.out.println(formateadorfecha.format(fecha) + "b  " + formateadorfecha.format(hora_citas.getFecha_trabajo()) + "b " +Integer.parseInt(formatearHora.format(hora_citas.getFecha_trabajo()))+ " " +(horaseleccionada+8));
                            Cita cita= proxy.pedirCita(C_Administrador.getIdSesion(), this.beneficiario, medico.getIdMedico_pk(), hora_citas.getFecha_trabajo(), 0);
                           
                    }
                }
            }else{
                ventanacitas.error(5);
            }
        } catch (CitaYaExistenteException ex){
            ventanacitas.error(6);
        } catch (BeneficiarioInexistenteException ex) {
            ventanacitas.error(7);
            Logger.getLogger(Controlador_Gestion_Cistas.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MedicoInexistenteException ex) {
            ventanacitas.error(7);
        } catch (FechaNoValidaException ex) {
            ventanacitas.error(7);
        } catch (Exception ex) {
            ventanacitas.error(7);
        }

    }

    public void rechazarcita(int horaseleccionada, Date date, String string) {
        if(vectorcitas!=null){
            try{
                DateFormat formateadorhora=  new SimpleDateFormat("HH");
                Cita cita_aux= null;
                int horatrabajo;
                boolean elimina= false;
                for(int i=0; i< vectorcitas.size(); i++){
                    cita_aux= (Cita)vectorcitas.get(i);
                    if(cita_aux.getFechaHora().substring(0, 10).equals(formateadorfecha.format(date))){
                        horatrabajo= Integer.parseInt(cita_aux.getFechaHora().substring(11, 13));
                        if(horatrabajo== (horaseleccionada+8)){
                            elimina= true;
                            proxy.rechazarCita(C_Administrador.getIdSesion(), cita_aux);
                         }
                    }
                }
                if(!elimina)
                    ventanacitas.error(8);
            }catch (CitaNoValidaException ex){
                ventanacitas.error(8);
            }catch (Exception ex){
                ventanacitas.error(8);
            }

        }else{
            ventanacitas.error(8);
        }

    }

}
